package Thread;
/**当多个线程尝试获取同一个锁对象时，只有一个线程可以成功获取锁并进入临界区（即 synchronized 块）。
 其他线程会被阻塞，直到锁被释放。
 如果 t1 和 t2 使用不同的锁对象（例如 locker1 和 locker2），
 那么两个线程可以同时进入各自的 synchronized 块，这会导致 count++ 操作仍然存在竞争条件。*/

/*Object创建锁的优点：
灵活性：你可以为不同的操作使用不同的锁对象，这样可以减少线程间的竞争，提高并发性能。
可读性：使用一个显式的锁对象可以更清晰地表达出锁的意图，使得代码更容易理解和维护。*/


public class demo15_1 {
    private static int count = 0;
    public static void main(String[] args) throws InterruptedException {
        Object locker1 = new Object();
        String s = new String();
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                synchronized (locker1) {    // ()中可以填写任意的对象，但是保证锁住的是同一个,填s也没关系
                    // 重要的是：是否多个线程针对同一个对象进行加锁（是否在竞争同一个锁）
                    count++;
                }
            }
            System.out.println("t1结束");
        });

        Thread t2 = new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                synchronized (locker1) {
                    count++;
                }
            }
            System.out.println("t2结束");
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join();
        System.out.println(count);
    }
}
